import type { IStructure } from "./structure";

export interface IStack<T> extends IStructure {
  push(item: T): void;
  pop(): T | undefined;
  peek(): T | undefined;
}

export interface IQueue<T> extends IStructure {
  enqueue(item: T): void;
  dequeue(): T | undefined;
  front(): T | undefined;
}

/**
 * 是一个函数，当当前任务完成时，它会被调用以触发队列中的下一个任务。
 */
export type NextFunc = (naxtArgs?: any) => void;

/**
 * 任务的实际执行函数
 * @param next 下一个任务函数
 * @param params push时传入的参数
 * @param args 上一个任务传来的参数
 */
export type AsyncCallback = (next: NextFunc, params: any, args: any) => void;

/**
 * 异步任务的结构
 */
export type AsyncTask = {
  /**
   * 任务的uuid
   * 唯一标识符uuid
   */
  uuid: number;

  /**
   * 回调函数数组
   */
  callbacks: Array<AsyncCallback>;

  /** 任务参数 */
  params: any;
};
